package cn.six1943.deepchat.module.ai.service.chatsession;

import cn.six1943.deepchat.module.ai.agent.AiConstant;
import cn.six1943.deepchat.module.ai.agent.ChatHandler;
import cn.six1943.deepchat.module.ai.controller.admin.chatsession.vo.ChatRequest;
import com.alibaba.fastjson.JSON;
import dev.langchain4j.rag.query.transformer.CompressingQueryTransformer;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 *
 */
@AllArgsConstructor
@Service(AiConstant.agent.SERVICE_BUILTIN)
@Slf4j
public class AgentBuiltinServiceImpl implements AgentService<ChatRequest> {

    // private final AiProperties props;
    // private final RedisChatMemoryStore redisChatMemoryStore;
    // private final CompressingQueryTransformer queryTransformer;

    // private final AssistantMapper assistantMapper;
    // private final AssistantCompleteMapper assistantCompleteMapper;
	// private final ElasticsearchClient elasticsearchClient;
	// private final IDocClient docClient;
	// private final RocketMQTemplate mqTemplate;

    @Override
    public void answerTheQuestion(ChatRequest request, ChatHandler handler) {
        log.info("agent::开始问答，{}", JSON.toJSONString(request));
		// AssistantCompleteEntity botConf = request.getAssistantCompleteEntity();
        // StreamingChatModel chatModel = ModelHolder.getChatModel(botConf.getModelId());
        // if (chatModel == null) {
        //     handler.onError(request.getSessionId(), request.getMessageId(), "模型配置错误，请检查");
        //     return;
        // }
        // String originQuestion = request.getQuestion();
        // // 文档
        // List<AgentOutput.DocReference> docReferences = new ArrayList<>();
		// List<AgentOutput.ModelUsage> modelUsages = new ArrayList<>();
		//
        // // faq
        // List<ContentRetriever> faqContentRetrievers = new ArrayList<>();
		// List<ContentRetriever> docContentRetrievers = new ArrayList<>();
        // if (ObjectUtil.isNotEmpty(botConf.getSpaces())) {
		// 	log.info("agent::开始处理知识库");
		// 	String faqIndex = RAGHelper.getFaqIndex(botConf.getTenantId());
		// 	String docIndex = RAGHelper.getItemIndex(botConf.getTenantId());
		// 	boolean faqFlag = false;
		// 	try {
		// 		BooleanResponse resp = elasticsearchClient.indices().exists(ExistsRequest.of(e -> e.index(faqIndex)));
		// 		faqFlag = resp.value();
		// 		log.info("agent::判断faq索引::{}", faqFlag);
		// 	} catch (IOException e) {
		// 		log.error("", e);
		// 	}
		// 	boolean docFlag = false;
		// 	try {
		// 		BooleanResponse resp = elasticsearchClient.indices().exists(ExistsRequest.of(e -> e.index(docIndex)));
		// 		docFlag = resp.value();
		// 		log.info("agent::判断文档索引::{}", docFlag);
		// 	} catch (IOException e) {
		// 		log.error("", e);
		// 	}
		// 	EmbeddingStore<TextSegment> faqEmbeddingStore;
		// 	if (faqFlag) {
		// 		faqEmbeddingStore = RAGHelper.getEmbeddingStore(props.getRag().getVectorstore(), faqIndex);
		// 	} else {
        //         faqEmbeddingStore = null;
        //     }
        //     EmbeddingStore<TextSegment> itemEmbeddingStore;
		// 	if (docFlag) {
		// 		itemEmbeddingStore = RAGHelper.getEmbeddingStore(props.getRag().getVectorstore(), docIndex);
		// 	} else {
        //         itemEmbeddingStore = null;
        //     }
        //     JSONArray spaces = botConf.getSpaces();
		// 	if (faqEmbeddingStore != null) {
		// 		log.info("agent::开始匹配faq直接回答");
		// 		List<Content> allFaqContent = new ArrayList<>();
		// 		String finalOriginQuestion = originQuestion;
		// 		spaces.forEach(space -> {
		// 			try {
		// 				JSONObject spaceJson = (JSONObject) space;
		// 				// 获取当前知识库向量模型
		// 				EmbeddingModel embeddingModel = ModelHolder.getEmbeddingModel(spaceJson.getLong("embeddingId"));
		// 				// faq存储
		//
		// 				ContentRetriever contentRetriever2 = RecordableEmbeddingStoreContentRetriever.builder()
		// 						.embeddingStore(faqEmbeddingStore)
		// 						.filter(metadataKey("knowledge_id").isEqualTo(spaceJson.getLong("id")))
		// 						.embeddingModel(embeddingModel)
		// 						.maxResults(1)
		// 						.minScore(botConf.getRetrieverFaqScore2()/100d)
		// 						.tokenUsageConsumer(tokenUsage -> publishTokenUsage(request, botConf, tokenUsage, TokenUsageType.OQ_EMBEDDING))
		// 						.build();
		// 				// faq直接回答
		// 				List<Content> retrieve = contentRetriever2.retrieve(Query.from(finalOriginQuestion));
		//
		// 				allFaqContent.addAll(retrieve);
		// 			} catch (Exception e) {
		// 				log.error("", e);
		// 			}
		// 		});
		// 		if (Func.isNotEmpty(allFaqContent)) {
		// 			log.info("agent::faq直接回答::匹配数量{}", allFaqContent.size());
		// 			//排序
		// 			allFaqContent.sort(Comparator.comparingDouble(c -> (Double) c.metadata().get(ContentMetadata.SCORE)));
		// 			Content content = allFaqContent.get(allFaqContent.size() - 1);
		// 			Map<ContentMetadata, Object> metadata = content.metadata();
		// 			Metadata tsMetadata = content.textSegment().metadata();
		// 			Long questionId = tsMetadata.getLong("question_id");
		// 			log.info("agent::faq直接回答::高分faq{}::分数{}::{}", questionId, metadata.get(ContentMetadata.SCORE), content.textSegment().text());
		// 			String answer = docClient.getAnswer(questionId);
		// 			if (Func.isNotEmpty(answer)) {
		// 				// 返回答案
		// 				// TokenUsage usage = null;
		// 				// AgentOutput.ModelUsage.ModelUsageBuilder modelUsage = AgentOutput.ModelUsage.builder()
		// 				// 		.modelId("0")
		// 				// 		.inputTokens(usage.inputTokenCount())
		// 				// 		.outputTokens(usage.outputTokenCount())
		// 				// 		.totalTokens(usage.totalTokenCount());
		// 				// modelUsages.add(modelUsage.build());
		// 				AgentOutput.DocReference dr = AgentOutput.DocReference.builder()
		// 						.bizId(StrUtil.toString(botConf.getBizId()))
		// 						.title(StrUtil.toStringOrNull(tsMetadata.getLong("knowledge_id")))
		// 						.docId(StrUtil.toStringOrNull(tsMetadata.getLong("item_id")))
		// 						.indexId(tsMetadata.getString("index"))
		// 						.text(content.textSegment().text())
		// 						.docUrl(tsMetadata.getString("url"))
		// 						.score((Double) metadata.get(ContentMetadata.SCORE)).build();
		// 				docReferences.add(dr);
		// 				AgentOutput output = AgentOutput.builder()
		// 						.models(modelUsages)
		// 						.docReferences(docReferences).build();
		// 				handler.onChunk(request.getSessionId(), request.getMessageId(), answer);
		// 				handler.onComplete(request.getSessionId(), request.getMessageId(), output);
		// 				log.info("agent::faq直接回答::结束回答");
		// 				return;
		// 			}
		// 		}
		// 	}
		//
		// 	if (faqEmbeddingStore != null) {
		// 		log.info("agent::开始faq召回");
		// 		spaces.forEach(space -> {
		// 			JSONObject spaceJson = (JSONObject) space;
		// 			// 获取当前知识库向量模型
		// 			EmbeddingModel embeddingModel = ModelHolder.getEmbeddingModel(spaceJson.getLong("embeddingId"));
		//
		// 			ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
		// 					.embeddingStore(faqEmbeddingStore)
		// 					.filter(metadataKey("knowledge_id").isEqualTo(spaceJson.getLong("id")))
		// 					.embeddingModel(embeddingModel)
		// 					.maxResults(props.getRag().getMaxResults())
		// 					.minScore(botConf.getRetrieverFaqScore1()/100d)
		// 					.build();
		// 			faqContentRetrievers.add(contentRetriever);
		// 		});
		// 	}
		// 	if (itemEmbeddingStore != null) {
		// 		log.info("agent::开始文档召回");
		// 		spaces.forEach(space -> {
		// 			JSONObject spaceJson = (JSONObject) space;
		// 			// 获取当前知识库向量模型
		// 			EmbeddingModel embeddingModel = ModelHolder.getEmbeddingModel(spaceJson.getLong("embeddingId"));
		//
		// 			// item存储
		// 			ContentRetriever contentRetrieverItem = EmbeddingStoreContentRetriever.builder()
		// 					.embeddingStore(itemEmbeddingStore)
		// 					.filter(metadataKey("knowledge_id").isEqualTo(spaceJson.getLong("id")))
		// 					.embeddingModel(embeddingModel)
		// 					.maxResults(botConf.getRetrieverSize())
		// 					.minScore(botConf.getRetrieverScore()/100d)
		// 					.build();
		// 			docContentRetrievers.add(contentRetrieverItem);
		// 		});
		// 	}
		// }
        // // faq达到匹配的直接返回（带知识来源）
		//
        // String afterQuestion = null;
		//
		// // 词汇处理
		// originQuestion = synonymFormat(originQuestion, botConf.getAssistantId(), botConf.getTenantId());
		// log.info("问题分词最终替换结果:" + originQuestion);
        // // 问题理解(经验和专业词）
        // if (botConf.getQuestionsExperience() == 1) {
		// 	log.info("agent::开始问题理解");
		// 	// 经验处理
		// 	originQuestion = getQuestionUnderstand(originQuestion, botConf.getAssistantId(), botConf.getTenantId(), botConf.getRetrieverSize(), botConf.getRetrieverScore(), botConf.getModelId(), request.getUserId(), request.getSessionId());
		// 	log.info("经验处理结果:" + originQuestion);
		// 	// // 组装提示词
        //     // ChatModel genModel = ModelHolder.getGenModel(botConf.getModelId());
		// 	//
        //     // ChatResponse genResp = genModel.chat(ChatRequest.builder().messages(UserMessage.from(originQuestion)).build());
        //     // // 获取答案
        //     // afterQuestion = genResp.aiMessage().text();
        //     // // 处理token
        //     // genResp.tokenUsage();
		// 	log.info("agent::结束问题理解");
        // }
		//
		//
        // // 互联网搜索
        // if (botConf.getEnableSearch() == 1) {
		// 	log.info("agent::启用搜索");
		// 	if (chatModel instanceof QwenStreamingChatModel qwenChatModel) {
		// 		log.info("agent::启用搜索::千问内置搜索");
		// 		ChatRequestParameters parameters = chatModel.defaultRequestParameters();
		// 		Field feild1 = ReflectUtil.getField(parameters.getClass(), "enableSearch");
		// 		Optional.ofNullable(feild1).ifPresent(f -> ReflectUtil.setFieldValue(parameters, f, true));
		// 	} else {
		//
		// 	}
        //     // // langchain4j-web-search-engine-tavily
        //     // WebSearchEngine webSearchEngine = TavilyWebSearchEngine.builder()
        //     // 		.apiKey(System.getenv("TAVILY_API_KEY")) // get a free key: https://app.tavily.com/sign-in
        //     // 		.build();
        //     //
        //     // ContentRetriever webSearchContentRetriever = WebSearchContentRetriever.builder()
        //     // 		.webSearchEngine(webSearchEngine)
        //     // 		.maxResults(3)
        //     // 		.build();
        //     // contentRetrievers.add(webSearchContentRetriever);
        // }
		//
        // // 推理经验
        // String exp = StrUtil.EMPTY;
        // if (botConf.getSumExperience() == 1) {
		// 	log.info("agent::开始处理推理总结经验");
        //     // 经验处理
        //     exp = retrieverAnswerExp(request, botConf, Optional.ofNullable(afterQuestion).orElse(originQuestion));
        // }
		//
        // // 组装提示词
        // String template = StrUtil.format(props.getRag().getDefaultTemplate(),
        //         StrUtil.blankToDefault(botConf.getPrompt(), props.getRag().getDefaultPrompt()),
        //         StrUtil.blankToDefault(botConf.getDefaultAnswer(), props.getRag().getDefaultAnswer()),
        //         ObjectUtil.equals(botConf.getAnswerRange(), 3) ? StrUtil.EMPTY : props.getRag().getRangeKnowledge(),
        //         exp
        // );
        // PromptTemplate defaultPromptTemplate = PromptTemplate.from(template);
		//
        // // 创建助手
        // // 系统消息
        // Function<Object, String> systemMessageProvider = memoryId -> StrUtil.isNotBlank(botConf.getPrompt()) ? botConf.getPrompt() : props.getSystemTemplate();
        // //上下文记忆
        // ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder()
        //         .id(request.getSessionId())
        //         .maxMessages(Optional.ofNullable(botConf.getHistorySize()).orElse(3) * 2 + 2)
        //         .chatMemoryStore(redisChatMemoryStore)
        //         .build();
		//
        // // 召回器
        // List<ContentRetriever> contentRetrievers = new ArrayList<>();
        // contentRetrievers.addAll(faqContentRetrievers);
        // contentRetrievers.addAll(docContentRetrievers);
		//
        // //召回条件
        // QueryRouter queryRouter = new QueryRouter() {
        //     @Override
        //     public Collection<ContentRetriever> route(Query query) {
        //         if (query.text().length() < 3) {
        //             //返回空，不使用retrieval
        //             return Collections.emptyList();
        //         }
        //         return contentRetrievers;
        //     }
        // };
        // //指定提示词模板和携带metadata
        // ContentInjector contentInjector = DefaultContentInjector.builder()
        //         .promptTemplate(defaultPromptTemplate)
        //         .metadataKeysToInclude(List.of("file_name"))
        //         .build();
        // DefaultRetrievalAugmentor.DefaultRetrievalAugmentorBuilder retrievalAugmentorBuilder = DefaultRetrievalAugmentor.builder()
        //         .queryRouter(queryRouter)
        //         .contentInjector(contentInjector);
        // // 将历史对话关键信息优化到查询中
        // if (props.getRag().isCompressingQuery()) {
        //     retrievalAugmentorBuilder.queryTransformer(queryTransformer);
        // }
        // // 对查询结果进一步优化
        // if (props.getRag().isReRanking()) {
        //     // 选择用哪个查询评分
        //     Function<Map<Query, Collection<List<Content>>>, Query> querySelector = (queryToContents) -> queryToContents.keySet().iterator().next();
        //     //百炼排序
        //     ScoringModel scoringModel = ModelHolder.getScoringModel(25);
        //     ContentAggregator contentAggregator = RecordableReRankingContentAggregator.builder()
        //             .scoringModel(scoringModel)
        //             .querySelector(querySelector)
        //             .minScore(0.8)
		// 			.tokenUsageConsumer(tokenUsage -> publishTokenUsage(request, botConf, tokenUsage, TokenUsageType.RESULT_RERANKING))
        //             .build();
        //     retrievalAugmentorBuilder.contentAggregator(contentAggregator);
        // }
        // RetrievalAugmentor retrievalAugmentor = retrievalAugmentorBuilder.build();
		//
        // ChatRequestParameters parameters = chatModel.defaultRequestParameters();
        // Field feild1 = ReflectUtil.getField(parameters.getClass(), "temperature");
        // Optional.ofNullable(feild1).ifPresent(f -> ReflectUtil.setFieldValue(parameters, f, botConf.getTemperature()));
        // Field feild2 = ReflectUtil.getField(parameters.getClass(), "topP");
        // Optional.ofNullable(feild2).ifPresent(f -> ReflectUtil.setFieldValue(parameters, f, botConf.getTopP()));
		// // openai not support top-k
		// if (!(parameters instanceof OpenAiOfficialChatRequestParameters)) {
		// 	Field feild3 = ReflectUtil.getField(parameters.getClass(), "topK");
		// 	Optional.ofNullable(feild3).ifPresent(f -> ReflectUtil.setFieldValue(parameters, f, botConf.getTopK()));
		// }
		//
        // Assistant assistant = AiServices.builder(Assistant.class)
        //         .streamingChatModel(chatModel)
        //         .systemMessageProvider(systemMessageProvider)
        //         // 直接指定召回
        //         // .contentRetriever(contentRetriever)
        //         // 定制召回,支持多个，支持自定义prompt
        //         .retrievalAugmentor(retrievalAugmentor)
        //         // .chatMemory(MessageWindowChatMemory.withMaxMessages(3))
        //         // .chatMemory(TokenWindowChatMemory.withMaxTokens(300, embeddingTokenizer))
        //         .chatMemoryProvider(chatMemoryProvider)
        //         .build();
		//
        // long start = System.currentTimeMillis();
        // log.info(StrUtil.format("agent::大模型问答开始::{}::{}", request.getSessionId(), start));
        // assistant.answer(request.getQuestion())
        //         .onRetrieved(contents -> {
        //             contents.forEach(content -> {
		// 				Map<ContentMetadata, Object> metadata = content.metadata();
		// 				Metadata tsMetadata = content.textSegment().metadata();
		// 				AgentOutput.DocReference dr = AgentOutput.DocReference.builder()
		// 						.bizId(StrUtil.toString(botConf.getBizId()))
		// 						.title(StrUtil.toStringOrNull(tsMetadata.getLong("knowledge_id")))
		// 						.docId(StrUtil.toStringOrNull(tsMetadata.getLong("item_id")))
		// 						.indexId(tsMetadata.getString("index"))
		// 						.text(content.textSegment().text())
		// 						.docUrl(tsMetadata.getString("url"))
		// 						.score((Double) metadata.get(ContentMetadata.SCORE)).build();
        //                 docReferences.add(dr);
        //             });
        //         })
        //         .onPartialResponse(token -> {
		// 			if (handler.isStop()) {
		// 				return;
		// 			}
        //             log.info(StrUtil.format("agent::大模型问答进行::{}::耗时{}", request.getSessionId(), System.currentTimeMillis() - start));
        //             handler.onChunk(request.getSessionId(), request.getMessageId(), token);
        //         })
        //         .onCompleteResponse(resp -> {
        //             log.info(StrUtil.format("agent::大模型问答结束::{}::{}::耗时{}", request.getSessionId(), System.currentTimeMillis(), System.currentTimeMillis() - start));
        //             TokenUsage usage = resp.tokenUsage();
        //             AgentOutput.ModelUsage.ModelUsageBuilder modelUsage = AgentOutput.ModelUsage.builder()
        //                     .modelId(String.valueOf(botConf.getModelId()))
        //                     .inputTokens(usage.inputTokenCount())
        //                     .outputTokens(usage.outputTokenCount())
        //                     .totalTokens(usage.totalTokenCount());
		// 			modelUsages.add(modelUsage.build());
        //             AgentOutput output = AgentOutput.builder()
        //                     .models(modelUsages)
        //                     .docReferences(docReferences).build();
        //             // log.info("对话TokenUsage", usage);
        //             handler.onComplete(request.getSessionId(), request.getMessageId(), output);
        //         })
        //         .onError(e -> {
        //             log.error(StrUtil.format("agent::大模型问答报错::{}::{}", request.getSessionId(), System.currentTimeMillis()));
        //             log.error("model api error", e);
        //             List<ChatMessage> list = redisChatMemoryStore.getMessages(request.getSessionId());
        //             log.error(messagesToJson(list));
        //             if (ObjectUtil.isNotEmpty(list)) {
        //                 ChatMessage m = list.get(list.size() - 1);
        //                 if (m instanceof UserMessage) {
        //                     list.remove(m);
        //                 }
        //             }
        //             log.error(messagesToJson(list));
        //             redisChatMemoryStore.updateMessages(request.getSessionId(), list);
        //             handler.onError(request.getSessionId(), request.getMessageId(), e.getMessage());
        //         })
        //         .start();
    }
	//
	// public String getQuestionUnderstand(String originQuestion, Long assistantId, String tenantId, Integer retrieverSize, Double retrieverScore, Long modelId, Long userId, Long sessionId) {
	// 	// 查询匹配的经验
	// 	EmbeddingModel embeddingModel = ModelHolder.getEmbeddingModel(0);
	// 	EmbeddingStore<TextSegment> embeddingStore = RAGHelper.getEmbeddingStore(props.getRag().getVectorstore(), RAGHelper.getExperience(tenantId));
	// 	ContentRetriever contentRetriever = RecordableEmbeddingStoreContentRetriever.builder()
	// 		.embeddingStore(embeddingStore)
	// 		.filter(metadataKey("assistant_id").isEqualTo(assistantId)
	// 			.and(metadataKey("type").isEqualTo(1))
	// 			.or(metadataKey("is_recall").isEqualTo(1))
	// 		)
	//
	// 		.embeddingModel(embeddingModel)
	// 		.maxResults(retrieverSize)
	// 		.minScore(retrieverScore/100d)
	// 		.tokenUsageConsumer(tokenUsage -> publishTokenUsage(tenantId, userId, sessionId, modelId, tokenUsage, TokenUsageType.OQ_EMBEDDING))
	// 		.build();
	// 	// 组装提示词
	// 	String template = props.getRag().getQuestionTemplate();
	// 	// 指定提示词模板和携带metadata
	// 	PromptTemplate defaultPromptTemplate = PromptTemplate.from(template);
	// 	ContentInjector contentInjector = DefaultContentInjector.builder()
	// 		.promptTemplate(defaultPromptTemplate)
	// 		.build();
	// 	DefaultRetrievalAugmentor.DefaultRetrievalAugmentorBuilder retrievalAugmentorBuilder = DefaultRetrievalAugmentor.builder()
	// 			.contentRetriever(contentRetriever)
	// 			.contentInjector(contentInjector);
	//
	// 	RetrievalAugmentor retrievalAugmentor = retrievalAugmentorBuilder.build();
	//
	// 	ChatModel genModel = ModelHolder.getGenModel(modelId);
	// 	QuestionAssistant assistant = AiServices.builder(QuestionAssistant.class)
	// 		.chatModel(genModel)
	// 		.retrievalAugmentor(retrievalAugmentor)
	// 		.build();
	// 	Result<String> answer = assistant.answer(originQuestion);
	// 	originQuestion = answer.content();
	// 	TokenUsage tokenUsage = answer.tokenUsage();
	// 	TokenUsageEvent event = TokenUsageEvent.builder()
	// 		.tenantId(tenantId)
	// 		.modelId(modelId)
	// 		.userId(userId)
	// 		.event(TokenUsageType.OQ_2_FQ)
	// 		.itemId(sessionId)
	// 		.inputTokenCount(tokenUsage.inputTokenCount())
	// 		.outputTokenCount(tokenUsage.outputTokenCount())
	// 		.totalTokenCount(tokenUsage.totalTokenCount())
	// 		.build();
	// 	mqTemplate.convertAndSend(CloudProxyConstant.DESTINATION.CMP_TOPIC + CloudProxyConstant.HeadersTag.TOKEN_USAGE_EVENT, event);
	//
	// 	return originQuestion;
	// }
	//
	// private String synonymFormat(String originQuestion, Long assistantId, String tenantId) {
	// 	try {
	// 		// 问题分词
	// 		String finalOriginQuestion = originQuestion;
	// 		AnalyzeRequest analyzeRequest = AnalyzeRequest.of(a -> a
	// 			.analyzer("ik_smart") // 指定分词器
	// 			.text(finalOriginQuestion)
	// 		);
	// 		AnalyzeResponse analyze = elasticsearchClient.indices().analyze(analyzeRequest);
	// 		List<AnalyzeToken> tokens = analyze.tokens();
	// 		for (AnalyzeToken token : tokens) {
	// 			if (token.token().length() > 1) {
	// 				log.info("问题分词:" + token.token());
	// 				List<String> analyzeList = new ArrayList<>();
	// 				// 获取同义词
	// 				BoolQuery.Builder bool = QueryBuilders.bool();
	// 				bool.must(m -> m.match(t -> t.field("synonym").query(token.token())));
	// 				bool.must(m -> m.term(t -> t.field("assistantId").value(assistantId)));
	// 				bool.must(m -> m.term(t -> t.field("type").value(1)));
	// 				SearchRequest req = new SearchRequest.Builder()
	// 					.index(AI_LEXICON_ + tenantId)
	// 					.query(co.elastic.clients.elasticsearch._types.query_dsl.Query.of(q -> q.bool(bool.build())))
	// 					.trackTotalHits(TrackHits.of(t -> t.enabled(true)))
	// 					.ignoreUnavailable(true)
	// 					.build();
	//
	// 				SearchResponse<JSONObject> searchResp = elasticsearchClient.search(req, JSONObject.class);
	// 				List<Hit<JSONObject>> hits = searchResp.hits().hits();
	// 				log.info("问题同义词查询::{}", hits);
	// 				for (Hit<JSONObject> hit : hits) {
	// 					JSONObject source = hit.source();
	// 					String name = source.getString("name");
	// 					analyzeList.add(name);
	// 				}
	// 				if (analyzeList.size() > 0) {
	// 					originQuestion = originQuestion.replace(token.token(), token.token() + "(" + String.join(",", analyzeList) + ")");
	// 				}
	// 				log.info("问题分词替换:" + originQuestion);
	// 		}
	// 	}
	// 	} catch(IOException e){
	// 		throw new RuntimeException(e);
	// 	}
	//
	// 	return originQuestion;
	// }
	//
	// @Override
    // public void cleanMemory(String sessionId) {
    //     redisChatMemoryStore.deleteMessages(sessionId);
    // }
	//
    // private String retrieverAnswerExp(com.thclouds.ai.agent.ChatRequest request, AssistantCompleteEntity botConf, String q) {
    //     EmbeddingModel embeddingModel = ModelHolder.getEmbeddingModel(0);
    //     EmbeddingStore<TextSegment> embeddingStore = RAGHelper.getEmbeddingStore(props.getRag().getVectorstore(), RAGHelper.getExperience(botConf.getTenantId()));
	// 	ContentRetriever contentRetriever = RecordableEmbeddingStoreContentRetriever.builder()
    //             .embeddingStore(embeddingStore)
    //             .filter(metadataKey("assistant_id").isEqualTo(botConf.getAssistantId())
    //                     .and(metadataKey("type").isEqualTo(2))
    //                     .or(metadataKey("is_recall").isEqualTo(1))
    //             )
    //             .embeddingModel(embeddingModel)
    //             .maxResults(10)
    //             .minScore(0.7)
	// 			.tokenUsageConsumer(tokenUsage -> publishTokenUsage(request, botConf, tokenUsage, TokenUsageType.FQ_EMBEDDING))
    //             .build();
    //     log.info("推理经验查询::开始::{}", RAGHelper.getExperience(botConf.getTenantId()));
	// 	List<Content> list = contentRetriever.retrieve(Query.from(q));
	// 	log.info("推理经验查询::结束::{}", list.size());
	//
    //     return list.stream().map(c -> c.textSegment().text()).collect(Collectors.joining(StrUtil.LF));
    // }
	//
	// private void publishTokenUsage(String tenantId, long userId, long sessionId, long modelId, TokenUsage tokenUsage, String event) {
	// 	TokenUsageEvent e = TokenUsageEvent.builder()
	// 			.tenantId(tenantId)
	// 			.modelId(modelId)
	// 			.userId(userId)
	// 			.event(event)
	// 			.itemId(sessionId)
	// 			.inputTokenCount(tokenUsage.inputTokenCount())
	// 			.outputTokenCount(tokenUsage.outputTokenCount())
	// 			.totalTokenCount(tokenUsage.totalTokenCount())
	// 			.build();
	// 	mqTemplate.convertAndSend(CloudProxyConstant.DESTINATION.CMP_TOPIC + CloudProxyConstant.HeadersTag.TOKEN_USAGE_EVENT, e);
	// }
	//
	// private void publishTokenUsage(com.thclouds.ai.agent.ChatRequest request, AssistantCompleteEntity botConf, TokenUsage tokenUsage, String event) {
	// 	publishTokenUsage(botConf.getTenantId(), request.getUserId(), request.getSessionId(),
	// 			botConf.getModelId(), tokenUsage, event);
	// }
}
